// #include <iostream>
// using std::cout;
// using std::endl;

// #include <unistd.h>
// #include <signal.h>

// #include <sys/types.h>
// #include <sys/wait.h>

// // //int flag = 1;
// // volatile int flag = 1; //告诉编译器不要优化 不要设置内存不可见

// // void handler(int signo)
// // {
// //     flag = 0;
// //     cout<<"触发:"<<signo<<"信号!"<<" flag:"<<flag<<endl;
// // }

// // //触发信号修改全局变量停止循环 -- 对于编译器，使用-O0和O1进行优化 查看现象
// // int main()
// // {
// //     signal(SIGINT,handler);
// //     while(flag);

// //     return 0;
// // }


// // //子进程向父进程发送信号时 父进程循环也退出
// // int flag = 1;
// // void handler(int signo)
// // {
// //     cout<<"子进程信号:"<<signo<<endl;
// //     flag = 0;
// // }

// // //子进程运行完毕后会向父进程发送信号
// // int main()
// // {
// //     signal(SIGCHLD,handler);
// //     pid_t id = fork();
// //     if(id == 0)
// //     {
// //         int i = 5;
// //         while(i--)
// //         {
// //             cout<<"id2进程行中..."<<endl;
// //             sleep(1);
// //         }
// //         exit(1);
// //     }

// //     while(flag)
// //     {
// //         cout<<"主进程行中..."<<endl;
// //         sleep(1);
// //     }

// //     return 0;
// // }





// void handler(int signo) //循环回收一批子进程 子进程同时退出
// {    
//     while(true) //如果不使用循环去轮询回收子进程 则因为信号无法被重复保存 且在处理时可能被一起置为1 可能当前正在回收子进程时又有信号来了 此时无法处理 那么这批子进程就无法被回收
//     {//因为信号的处理与子进程发送信号是两个执行流并不同步，如果其他子进程发送信号在当前处理信号handler方法之前则会被一起置为0(因为信号不能重复保存，无非也就是将对应的比特位由0置1) 信号就丢失了
//         pid_t res = waitpid(-1,NULL,WNOHANG); //-1是等待任意一个子进程 与wait等价 但是设置WNOHANG不会在这里卡住 如果当前没有子进程需要回收就退出 有子进程需要回收就通过信号全部回收
//         if(res>0) //res大于0则表示有进程被回收
//             cout<<"子进程:"<<res<<"回收！"<<endl;
//         else
//             break;
//     }

//     cout<<"handler:子进程回收完成！"<<endl;
// }

// //使用信号回收子进程 而不让父进程wait 回收进程池
// int main()
// {
//     signal(SIGCHLD,SIG_IGN); //也可以设置信号忽略从而标记进程 操作系统帮我们回收
//     //signal(SIGCHLD,handler);
//     for(int i = 0;i<10;++i)
//     {
//         pid_t id = fork();
//         if(id == 0)
//         {
//             int i = 5;
//             while(i--)
//             {
//                 cout<<"id2进程行中..."<<endl;
//                 sleep(1);
//             }
//             exit(1);
//         }
//     }


//     while(true)
//     {
//         cout<<"主进程行中..."<<endl;
//         sleep(1);
//     }

//     return 0;
// }



 